home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
ABUSESRC.ZIP
/
AbuseSrc
/
macabuse
/
imlib
/
include
/
specs.hpp
< prev
next >
Wrap
C/C++ Source or Header
|
1997-05-20
|
7KB
|
219 lines
#ifndef __SPECS_HPP_
#define __SPECS_HPP_
#include "linked.hpp"
#include <stdio.h>
#include "jmalloc.hpp"
#include "system.h"
#include <fcntl.h>
#include <stdlib.h>
extern char *spec_types[];
#define SPEC_INVALID_TYPE 0
#define SPEC_COLOR_TABLE 1
#define SPEC_PALETTE 2
#define SPEC_IMAGE 4
#define SPEC_FORETILE 5
#define SPEC_BACKTILE 6
#define SPEC_CHARACTER 7
#define SPEC_MORPH_POINTS_8 8
#define SPEC_MORPH_POINTS_16 9
#define SPEC_GRUE_OBJS 10
#define SPEC_EXTERN_SFX 11
#define SPEC_DMX_MUS 12
#define SPEC_PATCHED_MORPH 13
#define SPEC_NORMAL_FILE 14
#define SPEC_COMPRESS1_FILE 15
#define SPEC_VECTOR_IMAGE 16
#define SPEC_LIGHT_LIST 17
#define SPEC_GRUE_FGMAP 18
#define SPEC_GRUE_BGMAP 19
#define SPEC_DATA_ARRAY 20
#define SPEC_CHARACTER2 21
#define SPEC_PARTICLE 22
#define SPEC_EXTERNAL_LCACHE 23
#define SPEC_SIGNATURE "SPEC1.0"
#define SPEC_SIG_SIZE 8
#define SPEC_FLAG_LINK 1
#define SPEC_SEARCH_INSIDE_OUTSIDE 1
#define SPEC_SEARCH_OUTSIDE_INSIDE 2
#define SPEC_SEARCH_INSIDE_ONLY 3
/* file specs
8 signature
2 number entries
[entries]
1 entry type
1 entry name length
X entry name (with null terminator)
1 flags
if (flags&LINK)
1 link filename length
X link filename
else
4 data size
4 offset
*/
void set_spec_main_file(char *filename, int search_order=SPEC_SEARCH_OUTSIDE_INSIDE);
void set_filename_prefix(char *prefix);
char *get_filename_prefix();
void set_save_filename_prefix(char *prefix);
char *get_save_filename_prefix();
#define JFILE_CLONED 1
class bFILE // base file type which other files should be derived from (jFILE & NFS for now)
{
protected :
unsigned char *rbuf,*wbuf;
unsigned long rbuf_start,rbuf_end,rbuf_size,
wbuf_end,wbuf_size; // can't seek while writing!
int flush_writes(); // returns 0 on failure, else # of bytes written
virtual int unbuffered_read(void *buf, size_t count) = 0;
virtual int unbuffered_write(void *buf, size_t count) = 0;
virtual int unbuffered_tell() = 0;
virtual int unbuffered_seek(long offset, int whence) = 0; // whence=SEEK_SET, SEEK_CUR,
// SEEK_END, ret=0=success
virtual int allow_read_buffering();
virtual int allow_write_buffering();
public :
bFILE();
virtual int open_failure() = 0;
int read(void *buf, size_t count); // returns number of bytes read, calls unbuffer_read
int write(void *buf, size_t count); // returns number of bytes written
int seek(long offset, int whence); // whence=SEEK_SET, SEEK_CUR, SEEK_END, ret=0=success
int tell();
virtual int file_size() = 0;
virtual ~bFILE();
// these read and writes, allways read/write Intel endian-ness
unsigned short read_short();
unsigned long read_long();
unsigned char read_byte();
double read_double();
void write_short(unsigned short x);
void write_long(unsigned long x);
void write_byte(unsigned char x);
void write_double(double x);
void set_read_buffer_size(long size);
} ;
class jFILE : public bFILE // this file type will use virtual opens inside of a spe
{
char *fname;
char *tmp_write_name;
int access;
int fd,flags;
long start_offset,file_length; // offset of file from actual file begining
long current_offset; // current offset
public :
int get_fd() const { return fd; }
void open_internal(char *filename, char *mode, int flags);
void open_external(char *filename, char *mode, int flags);
jFILE(char *filename, char *access_string); // same as fopen parameters
jFILE(FILE *file_pointer); // assumes fp is at begining of file
virtual int open_failure() { return fd<0; }
virtual int unbuffered_read(void *buf, size_t count); // returns number of bytes read
virtual int unbuffered_write(void *buf, size_t count); // returns number of bytes written
virtual int unbuffered_seek(long offset, int whence); // whence=SEEK_SET, SEEK_CUR,
// SEEK_END, ret=0=success
virtual int unbuffered_tell();
virtual int file_size() { return file_length; }
virtual ~jFILE();
} ;
class spec_entry
{
public :
char *name;
unsigned long size,offset;
unsigned char type;
spec_entry(unsigned char spec_type,
char *object_name,
char *link_filename,
unsigned long data_size,
unsigned long data_offset)
{ type=spec_type;
name=strcpy((char *)jmalloc(strlen(object_name)+1,"spec_entry::name"),object_name);
size=data_size; offset=data_offset;
}
void print();
~spec_entry() { if (name) jfree(name); }
} ;
class spec_directory
{
public :
void startup(bFILE *fp);
int total;
spec_entry **entries;
void *data;
long size;
// spec_directory(char *filename); ;; not allowed anymore, user must construct file first!
spec_directory(FILE *fp);
spec_directory(bFILE *fp);
spec_directory();
spec_entry *find(char *name);
spec_entry *find(char *name, int type);
spec_entry *find(int type);
long find_number(char*name);
long find_number(int type);
void remove(spec_entry *e);
void add_by_hand(spec_entry *e);
void calc_offsets();
long data_start_offset(); // returns the firsyt offset past directory items
long data_end_offset(); // this should be the end of the file
long type_total(int type);
jFILE *write(char *filename);
int write(bFILE *fp);
void print();
void delete_entries(); // if the directory was created by hand instead of by file
~spec_directory();
} ;
/*jFILE *add_directory_entry(char *filename,
unsigned short data_type,
char *data_name,
unsigned long data_size,
char *link_filename=NULL);*/
unsigned short read_short(FILE *fp);
unsigned long read_long(FILE *fp);
unsigned short read_other_long(FILE *fp);
unsigned long read_other_short(FILE *fp);
unsigned char read_byte(FILE *fp);
void write_short(FILE *fp, unsigned short x);
void write_long(FILE *fp, unsigned long x);
void write_other_short(FILE *fp, unsigned short x);
void write_other_long(FILE *fp, unsigned long x);
void write_byte(FILE *fp, unsigned char x);
void set_spec_main_file(char *filename, int Search_order);
void set_file_opener(bFILE *(*open_fun)(char *, char *));
void set_no_space_handler(void (*handle_fun)());
bFILE *open_file(char *filename, char *mode);
#endif